/*
Automatic clinic tests using a robot arm.
Copyright (C) 2010  CIC-CPC, CHU Gabriel Montpied
All other trademarks, logos and copyrights are the property
of their respective owners.

This file is part of cpc-painbot.

cpc-painbot is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

cpc-painbot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with cpc-painbot.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef CPC_PAINBOT_CAPTEUR_H
#define CPC_PAINBOT_CAPTEUR_H
#include <QObject>
#include <QVariant>

class IndicateurProcess;

/*! Interface de Capteur.
    Un capteur est un objet capable d'émettre une mesure.
*/
class Capteur : public QObject
{
    Q_OBJECT
    //! Mesure associée au capteur.
    Q_PROPERTY(QVariant mesure READ mesure WRITE setMesure NOTIFY mesure)
public:
    //! Constructeur.
    Capteur(QObject *parent = 0);

    /*! Dernière mesure relevée.
        Il faut prendre note que certains capteurs peuvent être lents,
        ou pas actualisés : cette propriété représente la dernière valeur
        relevée, qui n'est pas forcément la plus à jour.

        \return Le dernier relevé.
    */
    QVariant mesure(void) const { return mesure_; }

public slots:
    /*! Définit la mesure du capteur.
        \param[in] mesure La mesure que le capteur doit prendre.
    */
    void setMesure(const QVariant &mesure);

    /*! Définit la mesure du capteur.
        Définit la mesure du Capteur, donné par un indicateur de process.
        \param[in] indicateur   Indicateur fournissant la mesure.
        \param[in] mesure       La mesure que le Capteur doit prendre.
    */
    void setMesure(const IndicateurProcess *indicateur, const QVariant &mesure);

signals:
    /*! Signale une mesure.
        Lorsque le capteur a effectué une mesure et que celle-ci est disponible,
        il la signale.

        \param val La valeur associée à la mesure.
    */
    void mesure(const QVariant &val);

protected:
    /*! Acquiert la mesure.
        Un capteur peut avoir à traiter l'information pour que celle-ci soit exploitable.
        La méthode par défaut se contente de charger la valeur.
        \param[in] mesure La nouvelle mesure.
    */
    virtual void acquerir(const QVariant &mesure);

    /*! Acquiert la mesure au travers d'un indicateur de process.
        Cela permet l'étalonnage entre les valeurs min et max, ou encore d'utiliser la tare.
        \param[in] indicateur   Indicateur fournissant la mesure.
        \param[in] mesure       Mesure relevée par l'indicateur.
    */
    virtual void acquerir(const IndicateurProcess *indicateur, const QVariant &mesure);

    QVariant mesure_; //!< Dernier relevé.
};

#endif // CPC_PAINBOT_CAPTEUR_H
